package com.sdksoft.readcard.utils

import android.content.Context
import com.csht.cache.MmkvManager
import com.csht.cache.SpUtlils
import com.csht.enums.DecodeImageType
import com.csht.enums.EnableCardScanType
import com.csht.enums.ReadCardType
import com.csht.readcard.ReadCardManager
import com.csht.readcard.ReadSettingBuilder
import com.csht.utils.BytesUtils
import com.csht.utils.JsonUtils
import com.sdksoft.readcard.testConfig.bean.ConfigBean

class ReadCardManagerUtil private constructor(){

    private lateinit var readSettingBuilder: ReadSettingBuilder

    private var configBean = ConfigBean()

    companion object{
        val init : ReadCardManagerUtil by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
            ReadCardManagerUtil()
        }

        val READ_CONFIG_KEY = "read_config"
    }

    fun initReadSettingBuilder(context: Context){
        MmkvManager.init(context, false)
        val config = SpUtlils.getString(READ_CONFIG_KEY, "")
        try {
            if (config.isNotEmpty()) {
                configBean = JsonUtils.gson.fromJson<ConfigBean>(config, ConfigBean::class.java)
            }
        } catch (e: Exception) {
        }
        readSettingBuilder = ReadCardManager
            // 上下文
            .builder(context)
            // 是否开启蜂鸣器
            .buildOpenSound(configBean.openSound)
            // 是否开启日志，第二位参数为日志保存的目录，
            // 传空字符时，默认在 Android/data/包名/files/zrgkreadcardlog 下
            .buildOpenLog(configBean.openLog, "")
            // 测试使用的 appid 不可以用于商用(否则后果自负)。
            // 商用的 appid、appkey、 appsecret 请务必联系我司商务进行分配。
            // appkey、 appsecret 建议使用远程推送等方式进行下发。便于发现密钥出现泄漏时，能及时远程下发修改。
            .buildAppId(configBean.appid, configBean.appkey, configBean.appsecret) // FGN2XTPYIZKS  ZRGK20111124
            // 设置IP与端口号（传空字符和0时，默认使用内置地址）
            .buildIpAndPort(configBean.ip, configBean.port)
            // 设置护照服务器IP与端口号
            .buildStandbyIpAndPort(configBean.standbyIp, configBean.standbyPort)
            // 设置串口号、波特率（串口读卡时需要设置）
            .buildSerialPort(configBean.deviceFilePath, configBean.baudrate)
            // 设置读卡类型（目前支持USB、USB_XZKJ、NFC、NFC_PASSPORT、
            // SERIALPORT、SAM_USB、SAM_SERIALPORT）
            .buildReadCardType(ReadCardType.USB)
            // 循环读卡时，是否允许返回连续相同的身份证信息（读卡类型 USB_XZKJ 时有效）
            .buildResultRepeatIdCard(false)
            // 照片解码类型（目前支持无照片、服务器解码、本地解码照片）
            .buildDecodeImageType(DecodeImageType.LOCAL_DECODE)
            // 设置开启的卡片识别类型（默认已启用了IC卡、身份证、港澳台、外国人居住证，其余证卡类型需要手动配置开启，用不到的可以不开启，以免影响读卡速度）
            .buildEnableCardScanType(EnableCardScanType.CARD_BANK, EnableCardScanType.CARD_SB, EnableCardScanType.CARD_LCT)
            // 开启本地缓存
            .buildOpenLocalCache(configBean.openLocalCache)
            // 是否需要身份证照片（默认为不需要，需要时请开启）
            .buildNeedIdCardPhoto(configBean.isNeedIdCardPhoto)
            // 是否需要护照照片（默认为不需要，需要时请开启）
            .buildNeedPassportPhoto(configBean.isPassportPhoto)
            // 是否需要移开卡片
            .buildIsNeedMoveCard(configBean.isNeedMoveCard)
            // 是否异步返回结果
            .buildIsAsynApiResult(configBean.isAsynApiResult)
            // 是否去掉人像照片的白色背景
            .buildDelIdCardPhotoWhiteBg(true)
            // 复位间隔时间,单位分钟。0，表示不执行复位
            .buildReBootGatTime(0)

        if (configBean.samACCode.isNotEmpty() && configBean.samACCode.length == 32) {
            // 设置SAM卡的AC代码（默认为空，需要时请设置）
            readSettingBuilder.buildSAMCode(BytesUtils.hexStringToBytes(configBean.samACCode))
        }

        DecodeImageType.values().forEach {
            if (it.codeType == configBean.decodeImageType) {
                readSettingBuilder.buildDecodeImageType(it)
                return@forEach
            }
        }
    }

    fun getReadSettingBuilder(): ReadSettingBuilder {
        return readSettingBuilder
    }
}